package org.finesys.common.dataPermission.factory;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import org.finesys.common.dataPermission.annotation.DataPermission;
import org.finesys.common.dataPermission.local.DataPermissionContextHolder;
import org.finesys.common.dataPermission.rule.DataPermissionRule;
import org.springframework.util.ObjectUtils;

import cn.hutool.core.util.ArrayUtil;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory {

    private final List<DataPermissionRule> rules;
    private List<DataPermissionRule> EMPTY_LIST = new ArrayList<>();

    @Override
    public List<DataPermissionRule> getDataPermissionRule() {
        // 容器中没有数据权限规则的配置
        if (ObjectUtils.isEmpty(rules)) {
            return EMPTY_LIST;
        }
        // 通过上下文获取数据权限注解
        DataPermission dataPermission = DataPermissionContextHolder.get();
        // 没有配置数据权限信息 则默认开启 生效所有规则
        if (Objects.isNull(dataPermission)) {
            // 返回容器中配置的所有数据权限规则
            return rules;
        }
        // 已配置数据权限信息 但是禁用 返回空
        if (!dataPermission.enable()) {
            return EMPTY_LIST;
        }
        // 已配置数据权限信息 但是仅生效部分规则
        if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) {
            // 过滤生效的数据权限规则
            return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass()))
                    .collect(Collectors.toList());
        }
        // 已配置数据权限 但是排除部分规则
        if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) {
            // 过滤出需要排除的数据权限规则
            return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass()))
                    .collect(Collectors.toList());
        }
        // 已配置数据权限信息 全部规则生效
        return rules;
    }
}
